"""Metadata generation logic for legacy source distributions. """ import logging import os from pip._internal.exceptions import InstallationError from pip._internal.utils.setuptools_build import make_setuptools_egg_info_args from pip._internal.utils.subprocess import call_subprocess from pip._internal.utils.temp_dir import TempDirectory from pip._internal.utils.typing import MYPY_CHECK_RUNNING if MYPY_CHECK_RUNNING: from pip._internal.build_env import BuildEnvironment logger = logging.getLogger(__name__) def _find_egg_info(directory): # type: (str) -> str """Find an .egg-info subdirectory in `directory`. """ filenames = [ f for f in os.listdir(directory) if f.endswith(".egg-info") ] if not filenames: raise InstallationError( "No .egg-info directory found in {}".format(directory) ) if len(filenames) > 1: raise InstallationError( "More than one .egg-info directory found in {}".format( directory ) ) return os.path.join(directory, filenames[0]) def generate_metadata( build_env, # type: BuildEnvironment setup_py_path, # type: str source_dir, # type: str isolated, # type: bool details, # type: str ): # type: (...) -> str """Generate metadata using setup.py-based defacto mechanisms. Returns the generated metadata directory. """ logger.debug( 'Running setup.py (path:%s) egg_info for package %s', setup_py_path, details, ) egg_info_dir = TempDirectory( kind="pip-egg-info", globally_managed=True ).path args = make_setuptools_egg_info_args( setup_py_path, egg_info_dir=egg_info_dir, no_user_config=isolated, ) with build_env: call_subprocess( args, cwd=source_dir, command_desc='python setup.py egg_info', ) # Return the .egg-info directory. return _find_egg_info(egg_info_dir)